class CommercialBank {
  public address: string = 'beijing'
  public name: string = 'wangwu'
  static count: number
  constructor(name: string, address: string) {
    this.address = address
    this.name = name
  }
  loan(): void {
    console.log(this.name + " 银行贷款")
  }
}
// ### 泛型工厂函数类型
type anyConstructorType = new (...args: any) => any  // 表示任意类的构造函数的类型。也就是泛型工厂函数类型
// CommercialBank的双重身份：即使一个构造函数变量（CommercialBank.count），也是一种类型，可以创建实例对象（new CommercialBank()）
type ConstructorType = new (...args: any) => CommercialBank  // 表示CommercialBank类的构造函数的类型。因为你返回的是CommercialBank类
type anyFnType = (...args: any) => any  // 表示任意一个普通函数类型

let CommercialBankInstance: ConstructorType = CommercialBank
let bank = new CommercialBankInstance("张三", "广州")
bank.loan()


// ### 泛型工厂函数类型，在type与interface中的写法
// 为什么 (...args: any): any ，这种写法没有箭头 =>？
// 因为这个类型前面没有属性，只能用方法的参数部分理解为属性名，方法的返回值理解为属性值。
type TestType = { (...args: any): any }  // 表示一个对象里有个say方法的类型
type TestType1 = { new (...args: any): any }  // 表示这个泛型工厂函数类型的本身的类型
interface TestType2 { new (...args: any): any }
// 等同与
type TestType3 = new (...args: any) => any


// ### 泛型工厂函数类型的实战
function createFactoryInstance(constructorType: TestType1) {
  console.log(constructorType.name + " 被创建")
  return new constructorType()
}
createFactoryInstance(CommercialBank)

export {}